import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //代表java中的字节码，为反射提供的
        //使用字符串Demo找到Demo这个类，然后创建一个对象，传参输出
        Class clazz = Class.forName("Demo");
        Demo demo =  (Demo) clazz.newInstance();//新的实例
//        System.out.println( demo.add(3,5));
        Field field =  clazz.getDeclaredField("name");

        //如果demo.getPubName获取的对象是被private，私有化，则需要另一种方法，强行设置为能访问，使用反射可以设置私有的值
        field.setAccessible(true);

        field.set(demo,"laowang");
//        System.out.println( field.getName());
        System.out.println(demo.getPubName());



//        Constructor con =  clazz.getConstructor();//只能访问公有的 public
//        Constructor con = clazz.getDeclaredConstructor(String.class);//无论公有的私有的，都可以拿到
//        con.newInstance("laowang");//根据构造函数也可以用反射new一个实例
//        System.out.println(demo.getPubName());
//        System.out.println( con.getName());



//        clazz.getMethod();//只能拿到public公有的方法
        Method method =  clazz.getDeclaredMethod("add", int.class, int.class);
        Test test =  method.getAnnotation(Test.class);
        System.out.println( test.desc());
        System.out.println( test.value());

//        method.getReturnType();
//        Class clax = method.getReturnType();
//        int i = (int)method.invoke(demo,2,3);//通过反射调用方法
//        System.out.println(i);
//        System.out.println(clax);
    }
}
